home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / util / cli / sploinerwos.lha / source.lha / split.c < prev    next >
C/C++ Source or Header  |  1995-09-26  |  3KB  |  146 lines

  1. #include "common.h"
  2. #include "split.h"
  3. #include "getbuff.h"
  4.  
  5. static void Breakup(FILE *fp, char *name, int filesize, int noshadow);
  6.  
  7. void split(int argc, char *argv[])
  8. {
  9.   FILE *fp;
  10.  
  11.   extern char *optarg;
  12.   extern int optind;
  13.   extern int opterr;
  14.   int ch;
  15.   int filesize=DISKSIZE;
  16.   int noshadow=FALSE;
  17.   char outname[256];
  18.   strncpy(outname,"Part",256);
  19.   opterr=0;
  20.  
  21.   if (argc==0) usage_split();
  22.       
  23.   if ((fp = fopen(*argv,"rb")) == NULL)
  24.     {
  25.       printf("Can't open %s\n",*argv);
  26.       usage_split();
  27.     }
  28.   else
  29.     {
  30.       while ((ch = getopt(argc, argv, "s:no:")) != EOF)
  31.     switch(ch) 
  32.       {
  33.       case 's':
  34.         if ((filesize=atoi(optarg))<10000) 
  35.           {
  36.         printf("Disksize < 10 Kb??? Go buy som bigger disks.\n");
  37.         exit(1);
  38.           }
  39.         break;
  40.       case 'n':
  41.         noshadow=TRUE;
  42.         break;
  43.       case 'o':
  44.         strncpy(outname,optarg,256); /* I don't know if optarg will be */
  45.                                      /* free'ed, but i take no cances */
  46.         outname[255] = '\0';/*Just in case optarg was more than 256 chars*/
  47.         break;
  48.       default:
  49.         usage_split();
  50.       }
  51.       argc -= optind;
  52.       argv += optind;
  53.       
  54.       Breakup(fp, outname, filesize, noshadow);
  55.       fclose(fp);
  56.     }
  57. }
  58.  
  59. static void Breakup(FILE *fp, char *name, int filesize, int noshadow)
  60. {
  61.   FILE *ofp; 
  62.   int ext, c, insize;
  63.   register countc, reached = 0;
  64.   int part=0;
  65.   char outfile[105];
  66.   char *shadow=NULL;
  67.   void *inbuffer, *outbuffer;
  68.  
  69.   insize = FileSize(fp);
  70.   if (filesize > insize) filesize = insize;
  71.  
  72.   OutputName(name, outfile);
  73.  
  74.   if (noshadow==FALSE) 
  75.     {
  76.       shadow = (char *) malloc(filesize);
  77.       if (shadow==NULL) 
  78.     { 
  79.       noshadow=TRUE; 
  80.       fprintf(stderr, "Not enough memory for shadowfile - running with\n");
  81.       fprintf(stderr, "noshadow (-n) option on.\n");
  82.     }
  83.       else for(countc=0 ; countc<filesize ; countc++) shadow[countc]=0;
  84.     }
  85.  
  86.   printf("Filesize: %d bytes\n", filesize);
  87.   ext=strlen(outfile)-4;
  88.    
  89.   outfile[ext+1] = ((part/100) + 48);
  90.   outfile[ext+2] = ((part/10) + 48);
  91.   outfile[ext+3] = ((part%10) + 48);
  92.   if ((ofp = fopen(outfile, "wb")) == NULL) 
  93.     {printf("Couldn't open %s for writing.\n",outfile); exit(1);}
  94.  
  95.   outbuffer=buffer_init(ofp, 10000);
  96.   
  97.   inbuffer=buffer_init(fp, 15000);
  98.  
  99.   for(countc=0 ; (c = getcbuf(inbuffer)) != EOF ; countc++)
  100.     {
  101.       if (countc == filesize)
  102.     {
  103.       flush(outbuffer);
  104.       discard(outbuffer);
  105.       fclose(ofp);
  106.       part++;
  107.       outfile[ext+1] = ((part/100) + 48);
  108.       outfile[ext+2] = ((part/10) + 48);
  109.       outfile[ext+3] = ((part%10) + 48);
  110.       countc = 0;
  111.       if ((ofp = fopen(outfile, "wb")) == NULL) 
  112.         {printf("Couldn't open %s for writing.\n",outfile); exit(1);}
  113.       outbuffer=buffer_init(ofp, 10000);
  114.     }
  115.       putcbuf(c, outbuffer);
  116.       if (((++reached)%32768) == 0)
  117.     {
  118.       fprintf(stderr, "\rWriting %s: ( %-8d / %-8d )", outfile ,reached, insize);
  119.       fflush(stderr);
  120.     }
  121.       if (!noshadow) shadow[countc]=shadow[countc] ^ c;
  122.     }
  123.   noshadow ? printf("\nDone!                    \n"):printf("\nDone! Writing Shadowfile.\n");
  124.   discard(inbuffer);
  125.   flush(outbuffer);
  126.   discard(outbuffer);
  127.   fclose(ofp);
  128.  
  129.   if (!noshadow)
  130.     {
  131.       outfile[ext+1] = 'S';
  132.       outfile[ext+2] = 'H';
  133.       outfile[ext+3] = 'A';
  134.       if ((ofp=fopen(outfile, "wb")) == NULL) 
  135.     {printf("Couldn't open %s for writing.\n",outfile); exit(1);}
  136.       if(fwrite(shadow, 1, filesize, ofp) != filesize)
  137.     printf("Error: Writing to <%s> failed.\n",outfile);
  138.       fclose(ofp);
  139.       part++;
  140.     }
  141.   printf("Output: %d files\n",part+1);
  142. }
  143.  
  144.  
  145.  
  146.